package cn.lin.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Text {
    public static void main(String[] args) {
        lenovo text = new lenovo();
        //上面这个是真实对象


        //动态代理
        /*第一个传入的数据是类的加载,传入真实对象.getClass().getClassLoader()
        第二个是 接口数组,保证相同的接口实现 传入真实对象.getClass().getInterfaces()
        第三使用匿名内部类来获取处理器*/
        proxytext proxy = (proxytext) Proxy.newProxyInstance(text.getClass().getClassLoader(), text.getClass().getInterfaces(), new InvocationHandler() {

            /*
             * 代理逻辑编写方法:所有代理对象调用的所有方法都会触发该方法执行*/
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /**
                 参数
                 proxy:代理对象
                 method:代理对象调用的方法,被封装为对象
                 args:代理对象调用方法时,传递的实际参数
                 */
              /* System.out.println("该方法执行了");
               System.out.println("调用的方法名为"+method.getName());
               //使用真实对象调用方法
               Object invoke = method.invoke(text, args);
                    //返回值为真实对象的调用方法后的返回值
               return invoke;*/
                if (method.getName().equals("sale")) {
                    //先判断是不是要的方法
                    double money = (double) args[0];
                    money = money * 1.25;
                    //加收25%的利息
                    System.out.println("我被增强了");
                    String obj = (String) method.invoke(text, money);
                    return obj + "_我是被增强后的返回值";
                } else {
                    Object obj = method.invoke(text, args);
                    return obj;
                }


            }
        });


        //调用
        System.out.println(proxy.sale(1000));
        System.out.println("--------------");
        proxy.show();
    }
}
